﻿using FlyingCircusWebIS.Models;
using System;
using System.Collections.Generic;
using System.Data.OleDb;
using System.Linq;
using System.Web;

namespace FlyingCircusWebIS.Models
{
    public class AeroportoDAO: IAeroportoDAO
    {
        private ICidadeDAO cidadeDAO;

        public AeroportoDAO()
        {
            cidadeDAO = new CidadeDAO();
        }


        public void Adicionar(Aeroporto entidade)
        {
            string sqlAtualizar = "insert into AEROPORTO (IdAeroporto, NomeAeroporto, Latitude, Longitude, IdCidade) values (seqAeroporto.nextVal, ?, ?, ?, ?)";
            
            // Configura o comando
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = GerenciadorConexao.Conexao;
            comando.CommandText = sqlAtualizar;

            OleDbParameter pNome = new OleDbParameter("NomeAeroporto", OleDbType.VarChar);
            pNome.Value = entidade.NomeAeroporto;
            comando.Parameters.Add(pNome);

            OleDbParameter pLatitude = new OleDbParameter("Latitude", OleDbType.Numeric);
            pLatitude.Value = entidade.Latitude;
            comando.Parameters.Add(pLatitude);

            OleDbParameter pLongitude = new OleDbParameter("Longitude", OleDbType.Numeric);
            pLongitude.Value = entidade.Longitude;
            comando.Parameters.Add(pLongitude);

            OleDbParameter pIdCidade = new OleDbParameter("IdCidade", OleDbType.Integer);
            pIdCidade.Value = entidade.IdCidade;
            comando.Parameters.Add(pIdCidade);

            // Insert
            comando.ExecuteNonQuery();
            comando.Dispose();
        }

        public void Atualizar(Aeroporto entidade)
        {
            string sqlAtualizar = "update AEROPORTO set NomeAeroporto = ?, Latitude = ?, Longitude = ?, IdCidade = ? where IdAeroporto = ?";
            
            // Configura o comando
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = GerenciadorConexao.Conexao;
            comando.CommandText = sqlAtualizar;

            OleDbParameter pNome = new OleDbParameter("NomeAeroporto", OleDbType.VarChar);
            pNome.Value = entidade.NomeAeroporto;
            comando.Parameters.Add(pNome);

            OleDbParameter pLatitude = new OleDbParameter("Latitude", OleDbType.Numeric);
            pLatitude.Value = entidade.Latitude;
            comando.Parameters.Add(pLatitude);

            OleDbParameter pLongitude = new OleDbParameter("Longitude", OleDbType.Numeric);
            pLongitude.Value = entidade.Longitude;
            comando.Parameters.Add(pLongitude);

            OleDbParameter pIdCidade = new OleDbParameter("IdCidade", OleDbType.Integer);
            pIdCidade.Value = entidade.IdCidade;
            comando.Parameters.Add(pIdCidade);


            OleDbParameter pIdAeroporto = new OleDbParameter("IdAeroporto", OleDbType.Integer);
            pIdAeroporto.Value = entidade.IdAeroporto;
            comando.Parameters.Add(pIdAeroporto);


            // Update
            comando.ExecuteNonQuery();
            comando.Dispose();
        }


        public Aeroporto BuscarPorId(int id)
        {
            Aeroporto registro = null;
            string sqlBuscar = "select * from AEROPORTO where IdAeroporto = ?";

            // Configura o comando
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = GerenciadorConexao.Conexao;
            comando.CommandText = sqlBuscar;

            OleDbParameter pId = new OleDbParameter("IdAeroporto", OleDbType.Integer);
            pId.Value = id;
            comando.Parameters.Add(pId);

            // Select
            OleDbDataReader dr = comando.ExecuteReader();
            if (dr.Read())
            {
                registro = ConverterDataReaderParaObj(dr);
            }
            dr.Close();
            comando.Dispose();

            if (registro != null)
                CarregarComposicao(registro);
            

            return registro;
        }

        private void CarregarComposicao(Aeroporto registro)
        {
            int idCidade = registro.IdCidade;
            Cidade cidade = cidadeDAO.BuscarPorId(idCidade);
            registro.Cidade = cidade;
        }

        private Aeroporto ConverterDataReaderParaObj(OleDbDataReader dr)
        {
            Aeroporto registro = new Aeroporto();
            registro.IdAeroporto = Int32.Parse(dr["IdAeroporto"].ToString());
            registro.NomeAeroporto = dr["NomeAeroporto"].ToString();
            registro.Latitude = Double.Parse(dr["Latitude"].ToString());
            registro.Longitude = Double.Parse(dr["Longitude"].ToString());
            registro.IdCidade = Int32.Parse(dr["IdCidade"].ToString());

            return registro;
        }

        public List<Aeroporto> Listar()
        {
            String sqlConsulta = "select * from AEROPORTO";

            // Configura o comando
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = GerenciadorConexao.Conexao;
            comando.CommandText = sqlConsulta;

            // Select
            OleDbDataReader dr = comando.ExecuteReader();

            List<Aeroporto> registros = new List<Aeroporto>();
            while (dr.Read())
            {
                Aeroporto registro = ConverterDataReaderParaObj(dr);
                registros.Add(registro);
            }
            dr.Close();
            comando.Dispose();

            foreach (var registro in registros)
            {
                CarregarComposicao(registro);
            }

            return registros;
        }

        public List<AeroportoCidade> ListarAeroportoCidade()
        {
            String sqlConsulta = "select * from AeroportoCidadeView order by NomeAeroporto";

            // Configura o comando
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = GerenciadorConexao.Conexao;
            comando.CommandText = sqlConsulta;

            // Select
            OleDbDataReader dr = comando.ExecuteReader();

            List<AeroportoCidade> registros = new List<AeroportoCidade>();
            while (dr.Read())
            {
                AeroportoCidade registro = new AeroportoCidade();
                registro.IdAeroporto = Int32.Parse(dr["IdAeroporto"].ToString());
                registro.NomeAeroporto = dr["NomeAeroporto"].ToString();
                registro.IdCidade = Int32.Parse(dr["IdCidade"].ToString());
                registro.NomeCidade = dr["NomeCidade"].ToString();
                registro.UF = dr["UF"].ToString();
                registro.Pais = dr["Pais"].ToString();

                registros.Add(registro);
            }
            dr.Close();
            comando.Dispose();

            return registros;
        }


        public void RemoverPorId(int id)
        {
            string sqlDeletar = "delete AEROPORTO where IdAeroporto = ?";

            // Configura o comando
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = GerenciadorConexao.Conexao;
            comando.CommandText = sqlDeletar;

            OleDbParameter pId = new OleDbParameter("IdAeroporto", OleDbType.VarChar);
            pId.Value = id;
            comando.Parameters.Add(pId);

            // Delete
            comando.ExecuteNonQuery();
            comando.Dispose();
        }


        public List<Aeroporto> ListarAeroportosPorIdCidade(int id)
        {
            String sqlConsulta = "select * from AEROPORTO where IdCidade = " + id;

            // Configura o comando
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = GerenciadorConexao.Conexao;
            comando.CommandText = sqlConsulta;

            // Select
            OleDbDataReader dr = comando.ExecuteReader();

            List<Aeroporto> registros = new List<Aeroporto>();
            while (dr.Read())
            {
                Aeroporto registro = ConverterDataReaderParaObj(dr);
                registros.Add(registro);
            }
            dr.Close();
            comando.Dispose();

            foreach (var registro in registros)
            {
                CarregarComposicao(registro);
            }

            return registros;
        }
    }
}